ADO.NET DataReader klasse
In dat lesonderdeel leren we hoe we gegevens uit de database kunnen inlezen met behulp van de DataReader klasse
Doelstellingen
- Leren begrijpen waarvoor de DataReader klasse dient.
- Nagaan of er rijen zijn ingelezen.
- Leren hoe je gegevens uit de database inleest met behulp van de DataReader.
- Begrijpen waarom je een DataReader moet sluiten.
- Schema informatie uit de DataReader halen.
Inleiding
De DataReader
klasse leest gegevens uit de database in op de meest efficiënte manier. Je kan de DataReader
“niet” gebruiken om gegevens te wijzigen. Eigenlijk kan je het wel door gebruik te maken van een Command
klasse. DataReaders zijn uiterst snelle, alleen voorwaarts, lezende stromen van gegevens.
Je kan gegevens uit een DataReader
alleen op een sequentieel voorwaartse manier lezen. Als je gegevens inleest moet je ze ergens opslaan want je kunt ze niet nogmaals lezen, tenzij je een nieuw DataReader
object maakt.
Het alleen voorwaarts design van de DataReader maakt de DataReader supersnel. De DataReader wordt niet vertraagd door de overlast van weg en weer tussen gegevens te navigeren en ze te updaten. De DataReader dient dus alleen voor het eenmaal lezen van gegevens. Ook als het aantal gegevens die je nodig hebt groter is dan het beschikbare interne geheugen is de DataReader de beste keuze.
Een DataReader object maken
Een instantie maken van een DataReader
klasse verschilt van andere klasse in ADO.NET. Je moet de ExecuteReader
() gebruiken van het Command object gebruiken:
SqlDataReader dr = command.ExecuteReader()
De ExecuteReader
() methode van het Command object retourneert een instantie van een DataReader
klasse. Een DataReader
maken het new sleutelwoord haalt helemaal niets uit. Het Command
object verwijst naar het Connection object en bevat het SQL statement die door het DataReader
object wordt gebruikt om gegevens op te vragen.
Gegevens inlezen
We weten al de een DataReader
object gegevens retourneert als een sequentiële stroom. Om die gegevens nu uit het DataReader
object te halen lees je rij per rij in. Als een rij is ingelezen, is de vorige rij niet meer beschikbaar. Als je de vorige rij opnieuw wilt inlezen moet je een nieuwe instantie van de DataReader
maken.
Meestal worden de rijen één per één ingelezen met behulp van een while lus.
Let op de Read
() methode van het DataReader
object in de test conditie van de while lus. De retourwaarde van Read
() is van het bool type en is true zolang er nog rijen te lezen zijn. Nadat de laatste rij gelezen is retourneer Read() false en wordt de while lus beëindigd. Je kan verschillende indexers gebruiken om de kolommen van een rij te benaderen.
string indexer
book.Firstname = dr["Firstname"].ToString(); book.Lastname = dr["Lastname"].ToString(); book.Title = dr["Title"].ToString(); book.Publisher = dr["Publisher"].ToString(); book.City = dr["City"].ToString(); book.PublicationYear = dr["PublicationYear"].ToString(); book.ReprintYear = dr["ReprintYear"].ToString(); book.Comment = dr["Comment"].ToString(); book.ISBN13 = dr["ISBN13"].ToString();
int indexer
Je kan de kolommen ook opvragen door gebruik te maken van een indexcijfer van de DataReader
:
// je kan int indexers gebruiken book.Firstname = dr[0].ToString(); book.Lastname = dr[1].ToString(); book.Title = dr[2].ToString(); book.Publisher = dr[3].ToString(); book.City = dr[4].ToString(); book.PublicationYear = dr[5].ToString(); book.ReprintYear = dr[6].ToString(); book.Comment = dr[7].ToString(); book.ISBN13 = dr[8].ToString();
Item collectie van de DataReader
Je kan gegevens uit een DataReader
ook halen met de eigenschap Item
, waarbij u de naam van de gevraagde kolom of een kolomindex doorgeeft. De eigenschap Item stuurt een basisobjectklasse terug die de waarde van de gevraagde kolom in de huidige rij vertegenwoordigt. U kunt op deze manier een kolom een naam geven, maar er wordt geen strong typing gebruikt. In het gunstigste geval wordt er een verwijzing naar een instantie van een objectklasse teruggestuurd die vervolgens wordt geconverteerd naar het juiste type.
OleDbDataReader myReader = cmdBoeken.ExecuteReader() while myReader.Read() { Console.WriteLine("\t{0}\t{1}\t{2}", myReader.Item(0), myReader.Item(1), myReader.Item(2)) }
De Item methode kan ook overloaded worden, in plaats van een index geeft u de kolomnaam door:
OleDbDataReader myReader = cmdBoeken.ExecuteReader() while myReader.Read() { Console.WriteLine("\t{0}\t{1}\t{2}", myReader.Item("ID"), myReader.Item("Voornaam"), myReader.Item("Naam")) }
De DataReader sluiten
Net zoals het Connection
object, moet je ook het DataReader
object sluiten. Stop de code in een try blok en sluit het DataReader
object af in het finally blok of gebruik using
.
Mijn voorkeur voor de DataReader
gaat uit naar using
:
using (SqlDataReader dr = command.ExecuteReader()) { while (dr.Read()) { ... } }